package xyz.scootaloo.oj.leetcode

import xyz.scootaloo.common.TestDsl

/**
 * 未完成
 * 设计
 * @author flutterdash@qq.com
 * @since 2021/3/27 15:20
 */
object P1472 : TestDsl {
    @JvmStatic
    fun main(args: Array<String>) {
        val browserHistory = BrowserHistory("leetcode.com")
        browserHistory.visit("google.com") // 你原本在浏览 "leetcode.com" 。访问 "google.com"
        browserHistory.visit("facebook.com") // 你原本在浏览 "google.com" 。访问 "facebook.com"
        browserHistory.visit("youtube.com") // 你原本在浏览 "facebook.com" 。访问 "youtube.com"
        browserHistory.back(1) shouldBe "facebook.com" // 你原本在浏览 "youtube.com" ，后退到 "facebook.com" 并返回 "facebook.com"
        browserHistory.back(1) shouldBe "google.com" // 你原本在浏览 "facebook.com" ，后退到 "google.com" 并返回 "google.com"
        browserHistory.forward(1) shouldBe "facebook.com" // 你原本在浏览 "google.com" ，前进到 "facebook.com" 并返回 "facebook.com"
        browserHistory.visit("linkedin.com") // 你原本在浏览 "facebook.com" 。 访问 "linkedin.com"
        browserHistory.forward(2) shouldBe "linkedin.com" // 你原本在浏览 "linkedin.com" ，你无法前进任何步数。
        browserHistory.back(2) shouldBe "google.com" // 你原本在浏览 "linkedin.com" ，后退两步依次先到 "facebook.com" ，然后到 "google.com" ，并返回 "v"
        browserHistory.back(7) shouldBe "leetcode.com" // 你原本在浏览 "google.com"， 你只能后退一步到 "leetcode.com" ，并返回 "leetcode.com"
    }

    /**
     * 1, 2, 3, 4 [5], 6, 7, 8
     *
     */
    private class BrowserHistory(homepage: String) {
        class Node(var url: String) {
            var precursor: Node? = null
            var next: Node? = null
            fun hasPre(): Boolean {
                return precursor != null
            }

            operator fun hasNext(): Boolean {
                return next != null
            }
        }

        var currentNode: Node?
        fun visit(url: String) {
            currentNode!!.next = Node(url)
            currentNode!!.next!!.precursor = currentNode;

            currentNode = currentNode!!.next
        }

        fun back(steps: Int): String {
            for (i in 0 until steps) {
                currentNode = if (currentNode!!.hasPre()) {
                    currentNode!!.precursor
                } else {
                    break
                }
            }
            return currentNode!!.url
        }

        fun forward(steps: Int): String {
            for (i in 0 until steps) {
                currentNode = if (currentNode!!.hasNext()) {
                    currentNode!!.next
                } else {
                    break
                }
            }
            return currentNode!!.url
        }

        init {
            currentNode = Node(homepage)
        }
    }
}
